package com.ygqh.baby.utils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicException;
import net.sf.jmimemagic.MagicMatch;
import net.sf.jmimemagic.MagicMatchNotFoundException;
import net.sf.jmimemagic.MagicParseException;

/**
 * 基础工具类
 * 
 * @author Administrator
 *
 */
public class CommonUtil {

	/**
	 * 反射为map赋值
	 * 
	 * @param _obj
	 * @param _setMap
	 * @throws Exception
	 */
	public static void refectPutMap(Object _obj, Map<String, Object> _setMap) throws Exception {

		Field[] fields = _obj.getClass().getDeclaredFields(); // 获取实体类的所有属性，返回Field数组
		for (Field field : fields) { // 遍历所有属性
			if (field != null) {
				// 非持久化字段
				if (field.getAnnotation(org.springframework.data.annotation.Transient.class) != null) {
					continue;
				}
				// 引用字段不更新
				if (field.getAnnotation(org.springframework.data.mongodb.core.mapping.DBRef.class) != null) {
					continue;
				}
				String name = field.getName(); // 获取属性的名字
				if ("serialVersionUID".equals(name)) {
					continue;
				}
				String tempName = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写，方便构造get，set方法
				Method m = null;
				try {
					m = _obj.getClass().getMethod("get" + tempName);
				} catch (Exception e) {
					continue;
				}
				if (m == null) {
					continue;
				}
				Object value = m.invoke(_obj);
				if (value != null) {
					if ((value instanceof String) && StringUtils.isBlank(String.valueOf(value))) {
						continue;
					}
					_setMap.put(name, value);
				}
			}
		}
	}

	/**
	 * 转义正则特殊字符 （$()*+.[]?\^{},|） mongodb模糊查询转义
	 * 
	 * @param keyword
	 * @return
	 */
	public static String escapeExprSpecialWord(String keyword) {
		if (StringUtils.isNotBlank(keyword)) {
			String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
			for (String key : fbsArr) {
				if (keyword.contains(key)) {
					keyword = keyword.replace(key, "\\" + key);
				}
			}
		}
		return keyword;
	}

	/**
	 * 获取文件类型
	 * @param file
	 * @return
	 */
	public static String getFileType(File file) {
		MagicMatch match;
		try {
			match = Magic.getMagicMatch(file, true, true);
			return match.getMimeType();
		} catch (MagicParseException | MagicMatchNotFoundException | MagicException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 大陆号码或香港号码均可
	 */
	public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
		return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
	}

	/**
	 * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数 此方法中前三位格式有： 13+任意数 15+除4的任意数 18+除1和4的任意数
	 * 17+除9的任意数 147
	 */
	public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
		String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
		Pattern p = Pattern.compile(regExp);
		Matcher m = p.matcher(str);
		return m.matches();
	}

	/**
	 * 香港手机号码8位数，5|6|8|9开头+7位任意数
	 */
	public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
		String regExp = "^(5|6|8|9)\\d{7}$";
		Pattern p = Pattern.compile(regExp);
		Matcher m = p.matcher(str);
		return m.matches();
	}

}
